blob: dff1eb2c5820bd60412382b1e5a908be33328087 [file] [log] [blame]
Soares Chend8b19bc2017-07-19 07:44:511<!doctype html>
2<meta charset=utf-8>
3<title>RTCRtpTransceiver.prototype.setCodecPreferences</title>
4<script src="/resources/testharness.js"></script>
5<script src="/resources/testharnessreport.js"></script>
6<script>
7 'use strict';
8
9 // Test is based on the following editor draft:
10 // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
11
12 /*
13 5.4. RTCRtpTransceiver Interface
14 interface RTCRtpTransceiver {
15 ...
16 void setCodecPreferences(sequence<RTCRtpCodecCapability> codecs);
17 };
18
19 setCodecPreferences
20 - Setting codecs to an empty sequence resets codec preferences to any
21 default value.
22
23 - The codecs sequence passed into setCodecPreferences can only contain
24 codecs that are returned by RTCRtpSender.getCapabilities(kind) or
25 RTCRtpReceiver.getCapabilities(kind), where kind is the kind of the
26 RTCRtpTransceiver on which the method is called. Additionally, the
27 RTCRtpCodecParameters dictionary members cannot be modified. If
28 codecs does not fulfill these requirements, the user agent MUST throw
Florent Castellidd2829c2019-05-08 15:36:3629 an InvalidModificationError.
Soares Chend8b19bc2017-07-19 07:44:5130 */
31
32 test(() => {
33 const pc = new RTCPeerConnection();
34 const transceiver = pc.addTransceiver('audio');
35 const capabilities = RTCRtpSender.getCapabilities('audio');
36 transceiver.setCodecPreferences(capabilities.codecs);
37
38 }, `setCodecPreferences() on audio transceiver with codecs returned from RTCRtpSender.getCapabilities('audio') should succeed`);
39
40 test(() => {
41 const pc = new RTCPeerConnection();
42 const transceiver = pc.addTransceiver('video');
43 const capabilities = RTCRtpReceiver.getCapabilities('video');
44 transceiver.setCodecPreferences(capabilities.codecs);
45
46 }, `setCodecPreferences() on video transceiver with codecs returned from RTCRtpReceiver.getCapabilities('video') should succeed`);
47
48 test(() => {
49 const pc = new RTCPeerConnection();
50 const transceiver = pc.addTransceiver('audio');
51 const capabilities1 = RTCRtpSender.getCapabilities('audio');
52 const capabilities2 = RTCRtpReceiver.getCapabilities('audio');
53 transceiver.setCodecPreferences([...capabilities1.codecs, ... capabilities2.codecs]);
54
55 }, `setCodecPreferences() with both sender receiver codecs combined should succeed`);
56
57 test(() => {
58 const pc = new RTCPeerConnection();
59 const transceiver = pc.addTransceiver('audio');
60 transceiver.setCodecPreferences([]);
61
62 }, `setCodecPreferences([]) should succeed`);
63
64 test(() => {
65 const pc = new RTCPeerConnection();
66 const transceiver = pc.addTransceiver('audio');
67 const capabilities = RTCRtpSender.getCapabilities('audio');
68 const { codecs } = capabilities;
69
70 if(codecs.length >= 2) {
71 const tmp = codecs[0];
72 codecs[0] = codecs[1];
73 codecs[1] = tmp;
74 }
75
76 transceiver.setCodecPreferences(codecs);
77
78 }, `setCodecPreferences() with reordered codecs should succeed`);
79
80 test(() => {
81 const pc = new RTCPeerConnection();
82 const transceiver = pc.addTransceiver('audio');
83 const capabilities = RTCRtpSender.getCapabilities('video');
Stephen McGruerd5103042020-01-23 21:45:4584 assert_throws_dom('InvalidModificationError', () => transceiver.setCodecPreferences(capabilities.codecs));
Soares Chend8b19bc2017-07-19 07:44:5185
Florent Castellidd2829c2019-05-08 15:36:3686 }, `setCodecPreferences() on audio transceiver with codecs returned from getCapabilities('video') should throw InvalidModificationError`);
87
88 test(() => {
89 const pc = new RTCPeerConnection();
90 const transceiver = pc.addTransceiver('audio');
91 const codecs = [{
92 mimeType: 'data',
93 clockRate: 2000,
94 channels: 2,
95 sdpFmtpLine: '0-15'
96 }];
97
Stephen McGruerd5103042020-01-23 21:45:4598 assert_throws_dom('InvalidModificationError', () => transceiver.setCodecPreferences(codecs));
Florent Castellidd2829c2019-05-08 15:36:3699
100 }, `setCodecPreferences() with user defined codec with invalid mimeType should throw InvalidModificationError`);
Soares Chend8b19bc2017-07-19 07:44:51101
102 test(() => {
103 const pc = new RTCPeerConnection();
104 const transceiver = pc.addTransceiver('audio');
105 const codecs = [{
106 mimeType: 'audio/piepiper',
107 clockRate: 2000,
108 channels: 2,
Florent Castellidd2829c2019-05-08 15:36:36109 sdpFmtpLine: '0-15'
Soares Chend8b19bc2017-07-19 07:44:51110 }];
111
Stephen McGruerd5103042020-01-23 21:45:45112 assert_throws_dom('InvalidModificationError', () => transceiver.setCodecPreferences(codecs));
Soares Chend8b19bc2017-07-19 07:44:51113
Florent Castellidd2829c2019-05-08 15:36:36114 }, `setCodecPreferences() with user defined codec should throw InvalidModificationError`);
Soares Chend8b19bc2017-07-19 07:44:51115
116 test(() => {
117 const pc = new RTCPeerConnection();
118 const transceiver = pc.addTransceiver('audio');
119 const capabilities = RTCRtpSender.getCapabilities('audio');
120 const codecs = [
121 ...capabilities.codecs,
122 {
123 mimeType: 'audio/piepiper',
124 clockRate: 2000,
125 channels: 2,
Florent Castellidd2829c2019-05-08 15:36:36126 sdpFmtpLine: '0-15'
Soares Chend8b19bc2017-07-19 07:44:51127 }];
128
Stephen McGruerd5103042020-01-23 21:45:45129 assert_throws_dom('InvalidModificationError', () => transceiver.setCodecPreferences(codecs));
Soares Chend8b19bc2017-07-19 07:44:51130
Florent Castellidd2829c2019-05-08 15:36:36131 }, `setCodecPreferences() with user defined codec together with codecs returned from getCapabilities() should throw InvalidModificationError`);
132
133 test(() => {
134 const pc = new RTCPeerConnection();
135 const transceiver = pc.addTransceiver('audio');
136 const capabilities = RTCRtpSender.getCapabilities('audio');
137 const codecs = [capabilities.codecs[0]];
138 codecs[0].clockRate = codecs[0].clockRate / 2;
139
Stephen McGruerd5103042020-01-23 21:45:45140 assert_throws_dom('InvalidModificationError', () => transceiver.setCodecPreferences(codecs));
Florent Castellidd2829c2019-05-08 15:36:36141
142 }, `setCodecPreferences() with modified codec clock rate should throw InvalidModificationError`);
143
144 test(() => {
145 const pc = new RTCPeerConnection();
146 const transceiver = pc.addTransceiver('audio');
147 const capabilities = RTCRtpSender.getCapabilities('audio');
148 const codecs = [capabilities.codecs[0]];
149 codecs[0].channels = codecs[0].channels + 11;
150
Stephen McGruerd5103042020-01-23 21:45:45151 assert_throws_dom('InvalidModificationError', () => transceiver.setCodecPreferences(codecs));
Florent Castellidd2829c2019-05-08 15:36:36152
153 }, `setCodecPreferences() with modified codec channel count should throw InvalidModificationError`);
154
155 test(() => {
156 const pc = new RTCPeerConnection();
157 const transceiver = pc.addTransceiver('audio');
158 const capabilities = RTCRtpSender.getCapabilities('audio');
159 const codecs = [capabilities.codecs[0]];
160 codecs[0].sdpFmtpLine = "modifiedparameter=1";
161
Stephen McGruerd5103042020-01-23 21:45:45162 assert_throws_dom('InvalidModificationError', () => transceiver.setCodecPreferences(codecs));
Florent Castellidd2829c2019-05-08 15:36:36163
164 }, `setCodecPreferences() with modified codec parameters should throw InvalidModificationError`);
Soares Chend8b19bc2017-07-19 07:44:51165
166 test(() => {
167 const pc = new RTCPeerConnection();
168 const transceiver = pc.addTransceiver('audio');
169 const capabilities = RTCRtpSender.getCapabilities('audio');
170
171 const { codecs } = capabilities;
172 assert_greater_than(codecs.length, 0,
173 'Expect at least one codec available');
174
175 const [ codec ] = codecs;
176 const { channels=2 } = codec;
177 codec.channels = channels+1;
178
Stephen McGruerd5103042020-01-23 21:45:45179 assert_throws_dom('InvalidModificationError', () => transceiver.setCodecPreferences(codecs));
Soares Chend8b19bc2017-07-19 07:44:51180
Florent Castellidd2829c2019-05-08 15:36:36181 }, `setCodecPreferences() with modified codecs returned from getCapabilities() should throw InvalidModificationError`);
Soares Chend8b19bc2017-07-19 07:44:51182
183 </script>